'use strict'

module.exports = core

// 思考：为什么这个能导出？如果是txt文件能导出吗？导出的规则是什么？
// require 能导出.js\.json\other
// .js/other =》 module.exports/exports
// .json => JSON.parse
const path = require('path')
const semver = require('semver')
const { program } = require('commander')
const colors = require('colors')
const userHome = require('user-home')
const pathExists = require('path-exists').sync
const pkg = require('../package.json')
const logger = require('@medlog-cli-dev/log')
// const init = require('@medlog-cli-dev/init')
const exec = require('@medlog-cli-dev/exec')
const { LOWEST_NODE_VERSION, DEFAULT_CLI_HOME } = require('./const.js')

async function core() {
  try {
    await prepare()
    // 6、注册命令
    registerCommander()
  } catch (e) {
    logger.error(e.message)
  }
}

async function prepare() {
  checkPkgVersion()
  checkNodeVersion()
  // 1、检查root启动
  checkRoot()
  // 2、检查用户主目录
  checkUserHome()
  // 3、检查命令中是否有参数，command中已经有了
  // checkArgs();
  // 4、检查环境变量
  checkEnv()
  // 5、检查当前是否为最新版本
  // await checkGlobalUpdate();
}

function registerCommander() {
  program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug', '是否开启调试模式', false)
    .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '')

  program
    .command('init [projectName]')
    .option('-f, --force', '是否强制初始化项目')
    .action(exec)

  program.on('option:debug', function () {
    //类似checkArgs方法
    process.env.LOG_LEVEL = program.debug ? 'verbose' : 'info'
    logger.level = process.env.LOG_LEVEL
    console.log('debug', process.env.LOG_LEVEL)
  })
  program.on('option:targetPath', function (targetPath) {
    // 将自定义变量放在全局环境下，这样其他模块也能直接使用
    if (targetPath || program.targetPath) {
      process.env.CLI_TARGET_PATH = targetPath || program.targetPath
    }
  })
  program.on('command:*', (obj) => {
    console.error('未知的命令：' + obj[0])
    const availableCommands = program.commands.map((cmd) => cmd.name())
    console.log('可用命令：' + availableCommands.join(','))
  })
  program.parse(process.argv)
  if (program.args && program.args.length < 1) {
    program.outputHelp()
  }
  logger.info('注册命令成功', 'success')
}

async function checkGlobalUpdate() {
  // 1、获取当前版本号和莫名
  const curV = pkg.version
  const npmname = pkg.name
  // 2、调用npm API获取所有的版本号
  const { getNpmSemverVersion } = require('@medlog-cli-dev/utils')
  // 3、提取所有版本号，比对哪些版本号是大于当前版本号
  const lastVersion = await getNpmSemverVersion(curV, npmname)
  // 4、获取最新版本号，提示用户更新到该版本
  if (lastVersion && semver.gt(lastVersion, curV)) {
    logger.warn(
      colors.yellow(
        `请手动更新${npmname}，当前版本：${curV}，最新版本为：${lastVersion}`
      )
    )
  }
}

let config
function checkEnv() {
  const dotenv = require('dotenv')
  const dotenvPath = path.resolve(userHome, '.env')
  if (pathExists(dotenvPath)) {
    config = dotenv.config({
      path: dotenvPath,
    })
  }
  //medlog verb config { parsed: { CLI_HOME: '.medlog-cli' } }
  // logger.verbose("config", process.env.CLI_HOME);
  //当用户没有设置缓存主目录时，我们自动帮他创建
  // 如果用户手动配置了我们就取用户配的，否则给一个默认的
  let cliConfig = {
    home: userHome,
    cliHome: '',
  }
  if (process.env.CLI_HOME) {
    cliConfig.cliHome = path.join(userHome, process.env.CLI_HOME)
  } else {
    cliConfig.cliHome = path.join(userHome, DEFAULT_CLI_HOME)
  }
  process.env.CLI_HOME_PATH = cliConfig.cliHome
  logger.verbose('环境变量', process.env.CLI_HOME_PATH)
  // createDefaultConfig();
}

// function createDefaultConfig() {
//   let cliConfig = {
//     home: userHome,
//   };
//   // 如果用户手动配置了我们就取用户配的，否则给一个默认的
//   if (process.env.CLI_HOME) {
//     cliConfig.cliHome = path.join(userHome, process.env.CLI_HOME);
//   } else {
//     cliConfig.cliHome = path.join(userHome, DEFAULT_CLI_HOME);
//   }
//   process.env.CLI_HOME_PATH = cliConfig.cliHome;
//   logger.verbose("环境变量", process.env.CLI_HOME_PATH);
//   return cliConfig;
// }

function checkArgs() {
  logger.success('checkArgs')
  const minimist = require('minimist')
  const args = minimist(process.argv.slice(2))
  process.env.LOG_LEVEL = args.debug ? 'verbose' : 'info'
  logger.level = process.env.LOG_LEVEL
}

function checkUserHome() {
  if (!userHome || !pathExists(userHome)) {
    throw new Error('当前主目录不存在')
  }
}

function checkRoot() {
  // const rootCheck = require('root-check')
  // rootCheck()
  // console.log(process.geteuid())
}
// 打印当前版本号
function checkPkgVersion() {
  logger.success('currentVersion', pkg.version)
}

function checkNodeVersion() {
  logger.success('currentNodeVersion', process.version)
  const currentNodeVersion = process.version
  if (!semver.gte(currentNodeVersion, LOWEST_NODE_VERSION)) {
    throw new Error('需要安装10.16.0以上的node版本')
  }
}
